import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns  # 用于增强配色
import os

# 读取Excel文件并保留原始列名
filename = 'data\附件2-2清洗整理后数据.xlsx'  # 替换为实际文件路径
data = pd.read_excel(filename)

# 提取数据并确保作物名称是字符串类型，同时去掉缺失值
data = data.dropna(subset=['作物名称', '亩产量/斤', '种植成本/(元/亩)', '销售单价/(元/斤)'])  # 删除包含空值的行
crop_names = data['作物名称'].astype(str)  # 确保作物名称为字符串类型
yield_per_acre = data['亩产量/斤']  # 访问亩产量
cost_per_acre = data['种植成本/(元/亩)']  # 访问种植成本
price_per_kg = data['销售单价/(元/斤)']  # 访问销售单价

# 设置字体，解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 使用seaborn的配色
colors = sns.color_palette('Set2', 10)

# 创建一个新的图窗
fig, axs = plt.subplots(3, 1, figsize=(10, 12))  # 创建3个子图，调整图窗大小

# 绘制亩产量柱状图
axs[0].bar(crop_names, yield_per_acre, color=colors)
axs[0].set_ylabel('亩产量（斤）', fontsize=12)
axs[0].set_title('不同作物的亩产量', fontsize=14)
axs[0].tick_params(axis='x', rotation=45, labelsize=10)  # 旋转标签以便于显示
axs[0].grid(True, linestyle='--', alpha=0.6)  # 添加网格线
# 添加数据标签
for i, value in enumerate(yield_per_acre):
    axs[0].text(i, value + 0.5, f'{value:.0f}', ha='center', fontsize=10)

# 绘制种植成本柱状图
axs[1].bar(crop_names, cost_per_acre, color=colors)
axs[1].set_ylabel('种植成本（元/亩）', fontsize=12)
axs[1].set_title('不同作物的种植成本', fontsize=14)
axs[1].tick_params(axis='x', rotation=45, labelsize=10)  # 旋转标签以便于显示
axs[1].grid(True, linestyle='--', alpha=0.6)  # 添加网格线
# 添加数据标签
for i, value in enumerate(cost_per_acre):
    axs[1].text(i, value + 10, f'{value:.0f}', ha='center', fontsize=10)

# 绘制销售单价柱状图
axs[2].bar(crop_names, price_per_kg, color=colors)
axs[2].set_ylabel('销售单价（元/斤）', fontsize=12)
axs[2].set_title('不同作物的销售单价', fontsize=14)
axs[2].tick_params(axis='x', rotation=45, labelsize=10)  # 旋转标签以便于显示
axs[2].grid(True, linestyle='--', alpha=0.6)  # 添加网格线
# 添加数据标签
for i, value in enumerate(price_per_kg):
    axs[2].text(i, value + 0.1, f'{value:.2f}', ha='center', fontsize=10)

# 调整子图之间的间距
plt.subplots_adjust(hspace=0.5)

# 添加全局标题
fig.suptitle('作物亩产量、种植成本和销售单价比较', fontsize=16)

# 保存图片到fig文件夹中
output_dir = 'fig'
if not os.path.exists(output_dir):
    os.makedirs(output_dir)  # 如果文件夹不存在，创建该文件夹

output_path = os.path.join(output_dir, 'crop_comparison_chart.png')
plt.savefig(output_path, bbox_inches='tight')  # 保存图片，bbox_inches='tight'确保不截断标签

# 显示图表
plt.show()